home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 014 / hidefile.bas < prev    next >
BASIC Source File  |  1984-09-24  |  13KB  |  277 lines

  1.  
  2. 10 REM ********************************************************************
  3. 20 REM *       HideFile             by            John Vandegrift         *
  4. 30 REM *                                                                  *
  5. 40 REM *  This program allows the user to modify diskette files in the    *
  6. 50 REM *  following ways.  First, the user can change a file to a normal  *
  7. 60 REM *  file, hidden file, system file or hidden/system file.  The file *
  8. 70 REM *  to be changed can be any of the above.  The second function of  *
  9. 80 REM *  this program is to allow the user to undelete files.  Although  *
  10. 90 REM *  this will undelete files, it is limited in its ability to do so.*
  11. 100 REM *  If a file is bigger than 512 bytes (1 sector), then the file    *
  12. 110 REM *  will have to be in on contiguous set of sectors, as this program*
  13. 120 REM *  doesn't know where else the sectors belonging to deleted file   *
  14. 130 REM *  were.  What this program does if a file is bigger than 512 bytes*
  15. 140 REM *  is check the sectors following the first sector of the program  *
  16. 150 REM *  to see if they are allocated.  If not, it assumes that those    *
  17. 160 REM *  sectors belong to that file and uses them.  If they are in use  *
  18. 170 REM *  then this program cannot undelete that file.  A user can also   *
  19. 180 REM *  use this to scan through the directory of a file.               *
  20. 190 REM *                                                                  *
  21. 200 REM *  Limitations:  If the diskette is double-sided, then this reads  *
  22. 210 REM *                the first 64 directory entries. The diskette in   *
  23. 220 REM *                drive A is the diskette to be read, although      *
  24. 230 REM *                provision is made for reading drive B if the user *
  25. 240 REM *                wants to add the user i/o for the drive. The      *
  26. 245 REM *                user must have 64k memory and 1 disk drive,       *
  27. 246 REM *                minimum configuration.                            *
  28. 250 REM ********************************************************************
  29. 260 CLEAR ,&H4000:KEY OFF
  30. 270 DEF SEG=0
  31. 275 GOSUB 1880
  32. 280 REM          Assembler Routine
  33. 290 REM
  34. 300 REM  This routine pokes a machine language subroutine into high memory.
  35. 310 REM  This subroutine reads and writes the diskette directory and FAT
  36. 320 REM  from/to the diskette to/from upper memory.
  37. 330 REM  The diskette buffer area starts at &hcc00 and is 3072 bytes.
  38. 340 REM  The subroutine is loaded at &hE000 and is 36 bytes.
  39. 350 REM
  40. 360 DATA &h55,&h06,&hb8,&h00,&h00
  41. 370 DATA &h8e,&hc0,&h8b,&hec,&h8b
  42. 380 DATA &h76,&h0a,&h8b,&h04,&h8a
  43. 390 DATA &he0,&hb0,&h06,&hbb,&h00
  44. 400 DATA &hcc,&hb9,&h02,&h00,&h8b
  45. 410 DATA &h76,&h08,&h8b,&h14,&hcd
  46. 420 DATA &h13,&h07,&h5d,&hca,&h04
  47. 430 DATA &h00
  48. 440 FOR I=1 TO 36:READ J:SUM=SUM+J:NEXT I
  49. 450 IF SUM<>3470 THEN CLS:PRINT "Sum = ";SUM;". Data Error!":STOP
  50. 460 RESTORE
  51. 470 FOR I=0 TO 35:READ J:POKE &HE000+I,J:NEXT I
  52. 480 SUBRT=&HE000
  53. 490 REM
  54. 500 REM         Call the routine to read FAT and Directory from diskette
  55. 510 REM         and check for single-sided format.
  56. 520 REM
  57. 530 A%=2    '2 for read or 3 for write
  58. 540 B%=0    '0 for drive A or 1 for drive B
  59. 550 CALL SUBRT (A%, B%)
  60. 560 IF PEEK(&HCC00)=&HFE THEN NOSIDES=1 ELSE NOSIDES=2
  61. 590 REM
  62. 600 REM         Master Menu
  63. 610 REM
  64. 620 REM  The user may want to follow the options in order of occurance,
  65. 630 REM  first reading the directory, then altering it and finally
  66. 640 REM  writing it back to the diskette.
  67. 650 REM
  68. 655 GOSUB 2130
  69. 660 CLS:LOCATE 2,37:PRINT "HideFile"
  70. 662 LOCATE 23,30:IF NOSIDES=1 THEN PRINT "Single-sided diskette":GOTO 670
  71. 665 PRINT "Double-sided diskette"
  72. 670 LOCATE 10,30:PRINT "1. File Directory"
  73. 680 LOCATE 11,30:PRINT "2. Alter Directory"
  74. 690 LOCATE 12,30:PRINT "3. Update Diskette"
  75. 700 LOCATE 13,30:PRINT "4. Help"
  76. 705 LOCATE 14,30:PRINT "5. Exit"
  77. 710 LOCATE 16,30:INPUT "Choice";IANS
  78. 730 ON IANS GOSUB 790,1030,750,2210,1880
  79. 735 IF IANS=5 THEN KEY ON:END
  80. 740 GOTO 660
  81. 745 REM
  82. 750 REM         Put Directory on diskette
  83. 751 REM
  84. 752 REM    This routine takes the diskette directory and FAT images
  85. 753 REM    in upper memory and writes them to the diskette.  Here
  86. 754 REM    drive A is assumed, just as it is when data is read from
  87. 755 REM    the diskette.
  88. 756 REM
  89. 760 A%=3:B%=0
  90. 770 CALL SUBRT (A%, B%)
  91. 780 RETURN
  92. 785 REM
  93. 790 REM         Display Files Routine
  94. 791 REM
  95. 792 REM    This is a simple direcTory function that reads the directory
  96. 793 REM    information from upper memory and displays to the user.  The
  97. 794 REM    user can use this to look at all of the directory entries.
  98. 795 REM    It will show what type of file is there, whether it has been
  99. 796 REM    deleted, or if the entry has never been used.
  100. 797 REM
  101. 800 CLS
  102. 810 FOR I=0 TO 2016 STEP 32
  103. 820 IF PEEK(I+&HD000)=&HE5 AND PEEK(I+&HD001)=246 THEN 1010
  104. 830 IF PEEK(I+&HD000)=&HE5 THEN DEL$="*del*" ELSE DEL$="     "
  105. 840 LOCATE ,15
  106. 850 FOR J=0 TO 7:PRINT CHR$(PEEK(J+I+&HD000));:NEXT J
  107. 860 PRINT ".";
  108. 870 FOR J=8 TO 10:PRINT CHR$(PEEK(J+I+&HD000));:NEXT J
  109. 880 A=PEEK(I+&HD00B)
  110. 890 IF A=0 THEN PRINT " Normal File       ";
  111. 900 IF A=2 THEN PRINT " Hidden File       ";
  112. 910 IF A=4 THEN PRINT " System File       ";
  113. 920 IF A=6 THEN PRINT " Hidden/System File";
  114. 930 MONTH$ = STR$((PEEK(I+&HD019) AND 1)*8 + ((PEEK(I+&HD018) AND 224)/32))
  115. 940 IF LEN(MONTH$)>2 THEN MONTH$=RIGHT$(MONTH$,2)
  116. 950 DAY$ = STR$(PEEK(I+&HD018) AND 31):IF LEN(DAY$)>2 THEN DAY$=RIGHT$(DAY$,2)
  117. 960 YEAR$ = RIGHT$(STR$((INT(PEEK(I+&HD019)/2))+1980),4)
  118. 970 THEDATE$=MONTH$+"/"+DAY$+"/"+YEAR$
  119. 980 SIZE=PEEK(I+&HD01C)+(PEEK(I+&HD01D)*256)+(PEEK(I+&HD01E)*65536!)
  120. 990 PRINT THEDATE$;" ";DEL$;" ";SIZE
  121. 995 IF ((I/32)+1) MOD 20 = 0 THEN GOSUB 1010:CLS
  122. 1000 NEXT I
  123. 1010 LOCATE 23,28:INPUT "Press return to continue",IANS
  124. 1020 RETURN
  125. 1025 REM
  126. 1030 REM         Alter Directory Entries Routine
  127. 1031 REM
  128. 1032 REM   Allows the user to page through the entries of the diskette
  129. 1033 REM   directory.  The user can change the file attribute from
  130. 1034 REM   Normal, Hidden, System, or Hidden/System to any of the same.
  131. 1035 REM   The user can also undelete deleted files.
  132. 1036 REM   This function does not save these changes to diskette!
  133. 1037 REM
  134. 1040 I=0
  135. 1050 CLS
  136. 1060 TITLE$=""
  137. 1070 LOCATE 2,30:PRINT "Directory Entry ";I/32+1
  138. 1080 IF PEEK(I+&HD000)=&HE5 THEN IF PEEK(I+&HD001)=246 THEN TITLE$="Unused":DEL$="":GOTO 1120 ELSE DEL$="*deleted*" ELSE DEL$=""
  139. 1090 FOR J=0 TO 7:TITLE$=TITLE$+CHR$(PEEK(J+I+&HD000)):NEXT J
  140. 1100 TITLE$=TITLE$+"."
  141. 1110 FOR J=8 TO 10:TITLE$=TITLE$+CHR$(PEEK(J+I+&HD000)):NEXT J
  142. 1120 LOCATE 10,20:PRINT TITLE$;
  143. 1130 A=PEEK(I+&HD00B)
  144. 1140 IF A=0 THEN PRINT " Normal File       ";
  145. 1150 IF A=2 THEN PRINT " Hidden File       ";
  146. 1160 IF A=4 THEN PRINT " System File       ";
  147. 1170 IF A=6 THEN PRINT " Hidden/System File";
  148. 1180 PRINT " "+DEL$
  149. 1190 LOCATE 23,10:PRINT "D - Delete toggle  F - File toggle  X - eXit  ";CHR$(27);" ";CHR$(26);" - Paging"
  150. 1200 A$=INKEY$:IF A$="" THEN 1200
  151. 1210 IF A$="X" OR A$="x" THEN RETURN
  152. 1220 IF A$="f" OR A$="F" THEN GOSUB 1280:POKE (I+&HD00B),ATTRIBUTE
  153. 1230 IF A$="d" OR A$="D" THEN GOSUB 1400:POKE (I+&HD000),LETTER1
  154. 1240 IF LEN(A$)=2 THEN A$=RIGHT$(A$,1)
  155. 1250 IF A$=CHR$(75) THEN IF I>31 THEN I=I-32
  156. 1260 IF A$=CHR$(77) THEN IF I<1985 THEN I=I+32
  157. 1270 GOTO 1050
  158. 1280 REM        Get New File Attribute
  159. 1290 LOCATE 23,10:PRINT STRING$(65,32)
  160. 1300 LOCATE 14,30:PRINT "File Attribute:"
  161. 1310 LOCATE 16,30:PRINT "1. Normal file"
  162. 1320 LOCATE 17,30:PRINT "2. Hidden file"
  163. 1330 LOCATE 18,30:PRINT "3. System file"
  164. 1340 LOCATE 19,30:PRINT "4. Hidden/System file"
  165. 1350 LOCATE 20,30:PRINT "5. Exit"
  166. 1355 LOCATE 22,30:INPUT "Choice   ";IANS
  167. 1356 IF IANS=5 THEN ATTRIBUTE=PEEK(I+&HD00B):GOTO 1380
  168. 1360 IF IANS<1 OR IANS>4 THEN LOCATE 20,35:PRINT STRING$(30,32):GOTO 1280
  169. 1370 ATTRIBUTE=(IANS-1)*2
  170. 1380 FOR K=14 TO 22:LOCATE K,30:PRINT STRING$(45,32):NEXT K
  171. 1390 RETURN
  172. 1395 REM
  173. 1400 REM        Undelete File
  174. 1401 REM
  175. 1402 REM   This routine allows the user to undelete a deleted file.
  176. 1403 REM   The size of the file is obtained from the directory and the
  177. 1404 REM   necessary number of sectors are checked following the first
  178. 1405 REM   sector of the file.  If none of the sectors following the
  179. 1406 REM   the first sector are allocated, the program assumes those
  180. 1407 REM   are the sectors belonging to the deleted program.  Otherwise,
  181. 1408 REM   it will not undelete the file!
  182. 1409 REM
  183. 1410 LOCATE 23,10:PRINT STRING$(65,32)
  184. 1420 LETTER1=PEEK(I+&HD000):IF LETTER1=&HE5 THEN 1460
  185. 1430 LOCATE 15,25:INPUT "This is not a deleted file. Press return";IANS$
  186. 1450 LOCATE 15,25:PRINT STRING$(53,32):RETURN
  187. 1460 SIZE=PEEK(I+&HD01C)+(PEEK(I+&HD01D)*256)+(PEEK(I+&HD01E)*65536!)
  188. 1470 SECTORS=INT((SIZE-1)/512)+1
  189. 1480 LOCATE 20,21:PRINT "File Size is ";SIZE;" bytes,";SECTORS;" sectors."
  190. 1490 CLUSTER = PEEK(I+&HD01A)+PEEK(I+&HD01B)*256
  191. 1500 LOCATE 21,21:PRINT "Starting Cluster is ";CLUSTER
  192. 1510 GOSUB 1600
  193. 1520 IF FLAG$="yes" THEN 1530 ELSE PRINT "There are sectors allocated after cluster ";CLUSTER;"!! Press return.";:INPUT IANS:GOTO 1580
  194. 1530 LOCATE 15,25:INPUT "Do you want to undelete this file?";IANS$
  195. 1540 IF LEFT$(IANS$,1)<>"Y" AND LEFT$(IANS$,1)<>"y" THEN 1580
  196. 1550 LOCATE 16,23:INPUT "Enter first letter for filename";IANS$
  197. 1560 LETTER1=ASC(IANS$)
  198. 1562 IF LETTER1<123 AND LETTER1>96 THEN LETTER1=LETTER1-31
  199. 1565 IF LETTER1<65 OR LETTER1>90 THEN 1530
  200. 1570 GOSUB 1680
  201. 1580 LOCATE 15,25:PRINT STRING$(53,32)
  202. 1590 LOCATE 16,25:PRINT STRING$(53,32):RETURN
  203. 1595 REM
  204. 1600 REM                Cluster's Last Stand(checks clusters)
  205. 1601 REM
  206. 1602 REM   This is the routine that checks the needed number of sectors
  207. 1603 REM   immediatly following the first sector of the file being
  208. 1604 REM   undeleted!  FLAG$ contains the indicator as to the outcome
  209. 1605 REM   of the check.
  210. 1606 REM
  211. 1608 IF NOSIDES=1 THEN RANGE=SECTORS ELSE RANGE=INT((SECTORS+1)/2)
  212. 1610 FOR INC=1 TO RANGE
  213. 1620 TEMP=INT((CLUSTER+INC-1)*1.5)
  214. 1630 IF CLUSTER MOD 2 = 1 THEN NEWCLUS=((PEEK(&HCC00+TEMP) AND 240)/16)+PEEK(&HCC00+TEMP+1)*256  ELSE NEWCLUS=PEEK(&HCC00+TEMP)+((PEEK(&HCC00+TEMP+1) AND 15)*256)
  215. 1640 IF NEWCLUS<>0 THEN FLAG$="no":GOTO 1670
  216. 1650 NEXT INC
  217. 1660 FLAG$="yes"
  218. 1670 RETURN
  219. 1675 REM
  220. 1680 REM                Cluster's Last Stand(updates clusters)
  221. 1681 REM
  222. 1682 REM   This routine reallocates the sectors following the first sector.
  223. 1683 REM   Appendix C of the DOS Manual gives the technique for accessing
  224. 1684 REM   this information.
  225. 1685 REM
  226. 1688 IF NOSIDES=1 THEN RANGE=SECTORS-1 ELSE RANGE=INT((SECTORS+1)/2)-1
  227. 1690 FOR INC=1 TO RANGE
  228. 1700 TEMP=INT((CLUSTER+INC-1)*1.5)
  229. 1710 IF (CLUSTER+INC-1) MOD 2 = 1 THEN BYTE1=(PEEK(&HCC00+TEMP) AND 15) + (((CLUSTER + INC) AND 15)*16):BYTE2=INT((CLUSTER+INC)/16):GOTO 1730
  230. 1720 BYTE1=(CLUSTER+INC) AND 255:BYTE2=(PEEK(&HCC00+TEMP+1) AND 240) + INT((CLUSTER+INC)/256)
  231. 1730 POKE (&HCC00+TEMP),BYTE1:POKE (&HCE00+TEMP),BYTE1
  232. 1740 POKE (&HCC00+TEMP+1),BYTE2:POKE (&HCE00+TEMP+1),BYTE2
  233. 1750 NEXT INC
  234. 1760 REM                poke end of file
  235. 1770 TEMP=INT((CLUSTER+RANGE)*1.5)
  236. 1780 IF (CLUSTER+RANGE) MOD 2 = 1 THEN BYTE1=(PEEK(&HCC00+TEMP) AND 15) + 240:BYTE2=255:GOTO 1800
  237. 1790 BYTE1=255:BYTE2=(PEEK(&HCC00+TEMP+1) AND 240) + 15
  238. 1800 POKE (&HCC00+TEMP),BYTE1:POKE (&HCE00+TEMP),BYTE1
  239. 1810 POKE (&HCC00+TEMP+1),BYTE2:POKE (&HCE00+TEMP+1),BYTE2
  240. 1820 RETURN
  241. 1880 REM
  242. 1890 REM                Ending Routine
  243. 1895 REM
  244. 2000 CLS
  245. 2010 A$="HideFile":B$="b":C$="y":D$="John Vandegrift":COUNT=10
  246. 2020 GOSUB 2060
  247. 2030 A$="        ":B$=" ":C$=" ":D$="               ":COUNT=9
  248. 2040 GOSUB 2060
  249. 2050 LOCATE 23,1:RETURN
  250. 2060 FOR I=1 TO COUNT
  251. 2070 LOCATE I,37:PRINT A$;
  252. 2080 LOCATE 12,4*I:PRINT B$;
  253. 2090 LOCATE 12,81-(4*I):PRINT C$;
  254. 2100 LOCATE 24-I,33:PRINT D$;
  255. 2110 NEXT I
  256. 2120 RETURN
  257. 2130 REM
  258. 2140 REM                Move Header back to top
  259. 2150 REM
  260. 2160 FOR I=14 TO 13 STEP -1:LOCATE I,33:PRINT SPACE$(15);:NEXT I
  261. 2170 A$="HideFile":FOR I=12 TO 3 STEP -1
  262. 2180 LOCATE I-1,37:PRINT A$;
  263. 2190 LOCATE I,37:PRINT SPACE$(8);
  264. 2195 NEXT I
  265. 2200 RETURN
  266. 2210 REM
  267. 2220 REM                Help Routine
  268. 2230 REM
  269. 2240 CLS:LOCATE 4,10:PRINT "(1)  File Directory lists the directory of the diskette."
  270. 2250 LOCATE 7,10:PRINT "(2)  Alter Directory allows the user to change directory attributes."
  271. 2260 LOCATE 10,10:PRINT "(3)  Save Changes is the only way to write changes (2) to the diskette."
  272. 2270 LOCATE 13,10:PRINT "(4)  EXIT ALLOWS THE USER TO EXIT THE PROGRAM."
  273. 2280 LOCATE 16,10:PRINT "(5)  Help is this screen."
  274. 2290 LOCATE 19,10:INPUT "Press return to continue....",IANS
  275. 2300 RETURN
  276. 65399 '** DONE - PRESS ENTER TO RETURN TO MENU **
  277.